/**
 * 普通函数：this 指向全局对象
 * 对象的方法：this 指向对象（调用者）
 * 构造函数：this 指向新创建的对象
 * 箭头函数：箭头函数没有自己的 this, 在箭头函数中使用 this 时，使用的是外层作用域的 this
 * 显示绑定：通过 call() apply() bind() 调用函数，this 指向参数指定的对象
 */
// 普通函数：this 指向全局对象 >>>
function fn() {
  console.log(this)
}
fn()
// 普通函数：this 指向全局对象 <<<

// 对象的方法：this 指向对象（调用者） >>>
var obj = {
  tag: 'obj',
  fn: function () {
    console.log(this)
  }
}
obj.fn()
// 对象的方法：this 指向对象（调用者） <<<

// 构造函数：this 指向新创建的对象 >>>
function Person() {
  console.log(this)
}
var person = new Person()
// 构造函数：this 指向新创建的对象 <<<

// 箭头函数：箭头函数没有自己的 this, 在箭头函数中使用 this 时，使用的是外层作用域的 this >>>
var obj2 = {
  tag: 'obj2',
  fn: function () {
    var fn2 = () => {
      console.log(this)
    }
    fn2()
  }
}
obj2.fn()
// 箭头函数：箭头函数没有自己的 this, 在箭头函数中使用 this 时，使用的是外层作用域的 this <<<

// 显示绑定：通过 call() apply() bind() 调用函数，this 指向参数指定的对象 >>>
var obj3 = { tag: 'obj3' }
function fn2() {
  console.log(this)
}
fn2.call(obj3)
// 显示绑定：通过 call() apply() bind() 调用函数，this 指向参数指定的对象 <<<
